package frsf.cidisi.exercise.proyectoia.clasesProyectoIA;

import java.util.ArrayList;

public class CuadranteBajo {

	public static int IDENTIFICADOR_NIVEL=2;
	int numero;
	Esquina esquinaCentral;
	Esquina[][] esquinas;
	int intensidad;
	int cantidadEsquinas;


public CuadranteBajo(int numero){
		
		this.numero=numero;
		intensidad = 0;
	}
	
	public CuadranteBajo(int numero, Esquina[][] esquinasCuadrante, Esquina centro, int cantEsquinas){
		
		this.numero=numero;
		esquinas=esquinasCuadrante;
		esquinaCentral=centro;
		intensidad = 20 * this.sumarPersonas();
		this.cantidadEsquinas = cantEsquinas;
	}
	
	public int getNumero(){
		return numero;
	}
	
	public Esquina getEsquinaCentral(){
		return esquinaCentral;
	}
	
	public Esquina[][] getEsquinas(){
		return esquinas;
	}

	public int sumarPersonas(){
		
		int suma=0;
		
		Esquina aux;
		
		for(int f=0; f<getEsquinas().length;f++){
			for(int c=0;c<getEsquinas()[f].length;c++){
				aux=getEsquinas()[f][c];
				if(aux.getVictimas()>0)
					suma=suma+aux.getVictimas();
				if(aux.getVictimarios()>0)
					suma=suma+aux.getVictimarios();
			}	
		}
		return suma;
	}

	public int getIntensidad() {
		return intensidad;
	}
	
	public Object[] esquinasAdyacentesNorte(int numero){
		
		int[] posicion = this.obtenerPosicion(numero);
		int x = posicion[0];
		int y = posicion[1];
		Object[] esquinasAdyacentes = new Object[4];
		int k=0;
		for(int i=x-1;i>=0;i--)
		{
			esquinasAdyacentes[k] = esquinas[i][y];
			k++;
		}
		for(int i=0;i<esquinasAdyacentes.length;i++){
			if (esquinasAdyacentes[i]==null)
				esquinasAdyacentes[i]= new Esquina(-1,"No existe esquina en la matriz",-1,0);
		}
		return esquinasAdyacentes;
			
			
		
		
	}
	
	public Object[] esquinasAdyacentesSur(int numero){
		
		int[] posicion = this.obtenerPosicion(numero);
		int x = posicion[0];
		int y = posicion[1];
		Object[] esquinasAdyacentes = new Object[4];
		int k=0;
		for(int i=x+1;i<this.esquinas.length;i++)
		{
			esquinasAdyacentes[k] = esquinas[i][y];
			k++;
		}
		for(int i=0;i<esquinasAdyacentes.length;i++){
			if (esquinasAdyacentes[i]==null)
				esquinasAdyacentes[i]= new Esquina(-1,"No existe esquina en la matriz",-1,0);
		}
		return esquinasAdyacentes;
			
			
		
		
	}
	
	public Object[] esquinasAdyacentesEste(int numero){
		
		int[] posicion = this.obtenerPosicion(numero);
		int x = posicion[0];
		int y = posicion[1];
		Object[] esquinasAdyacentes = new Object[4];
		int k=0;
		for(int i=y+1;i<this.esquinas[0].length;i++)
		{
			esquinasAdyacentes[k] = esquinas[x][i];
			k++;
		}
		
		for(int i=0;i<esquinasAdyacentes.length;i++){
			if (esquinasAdyacentes[i]==null)
				esquinasAdyacentes[i]= new Esquina(-1,"No existe esquina en la matriz",-1,0);
		}
		return esquinasAdyacentes;
			
	}
	
	public Object[] esquinasAdyacentesOeste(int numero){
		
		int[] posicion = this.obtenerPosicion(numero);
		int x = posicion[0];
		int y = posicion[1];
		Object[] esquinasAdyacentes = new Object[4];
		int k=0;
		for(int i=y-1;i>=0;i--)
		{
			esquinasAdyacentes[k] = esquinas[x][i];
			k++;
		}
		for(int i=0;i<esquinasAdyacentes.length;i++){
			if (esquinasAdyacentes[i]==null)
				esquinasAdyacentes[i]= new Esquina(-1,"No existe esquina en la matriz",-1,0);
		}
		
		
		return esquinasAdyacentes;
			
	}
	
	public Object esquinasAdyacentesDiagonal(int numero){
		Esquina esquina= this.getEsquinaIndex(numero);
		Object[] esquinasAdyacentes= this.verVecinosAdyacentes(esquina);
		
		return esquinasAdyacentes[4];
	}
	
	public ArrayList<ArrayList<Integer>> mirar(int numero){
		ArrayList<ArrayList<Integer>> direcciones= new ArrayList<ArrayList<Integer>>();
		
		ArrayList<Integer> esquinaActual=new ArrayList<Integer>();
		ArrayList<Integer> norte = new ArrayList<Integer>();
		ArrayList<Integer> sur=new ArrayList<Integer>();
		ArrayList<Integer> este=new ArrayList<Integer>();
		ArrayList<Integer> oeste=new ArrayList<Integer>();
		ArrayList<Integer> diagonal=new ArrayList<Integer>();
		
		Esquina esquinaA = getEsquinaIndex(numero);
		Object[] vectorN = esquinasAdyacentesNorte(numero);
		Object[] vectorS = esquinasAdyacentesSur(numero);
		Object[] vectorE = esquinasAdyacentesEste(numero);
		Object[] vectorO = esquinasAdyacentesOeste(numero);
		Esquina esquinaD = (Esquina)esquinasAdyacentesDiagonal(numero);
		
		esquinaActual.add((Integer)esquinaA.getCantidadPersonas());
		for(int k=0; k<vectorN.length;k++){
			norte.add((Integer)((Esquina)vectorN[k]).getCantidadPersonas());
		}
		for(int k=0; k<vectorS.length;k++){
			sur.add((Integer)((Esquina)vectorS[k]).getCantidadPersonas());
		}
		for(int k=0; k<vectorE.length;k++){
			este.add((Integer)((Esquina)vectorE[k]).getCantidadPersonas());
		}
		for(int k=0; k<vectorO.length;k++){
			oeste.add((Integer)((Esquina)vectorO[k]).getCantidadPersonas());
		}
		diagonal.add((Integer)esquinaD.getCantidadPersonas());
		
		
		direcciones.add(esquinaActual);
		direcciones.add(norte);
		direcciones.add(sur);
		direcciones.add(este);
		direcciones.add(oeste);
		direcciones.add(diagonal);
		
		return direcciones;
	
	}
	

	
	
	
	public int[] obtenerPosicion(int numero){
		int[] retorno = {0,0}; 
		for(int i=0;i<esquinas.length;i++)
			for(int j=0;j<esquinas[i].length;j++)
				if(esquinas[i][j].getCoordenada() == numero){
					retorno[0] = i;
					retorno[1] = j;
					
				}		
		return retorno;		
				
	}
	
	
	

	public Esquina getEsquinaIndex(int x){
		Esquina aux = new Esquina(0,"Esquina Vacia",-1,-1);
		for(int i=0; i<esquinas.length;i++){
			for(int j=0; j<esquinas[i].length;j++){
				if(esquinas[i][j].getCoordenada()==x){
					aux=esquinas[i][j];
				}
			}
		}
		return aux;
	}
	

	public Object[] verVecinosAdyacentes(Esquina esquina){
		if(esquina.getCoordenada()==95||esquina.getCoordenada()==100||esquina.getCoordenada()==110||esquina.getCoordenada()==98||esquina.getCoordenada()==29||esquina.getCoordenada()==32)
			return this.verVecinosAdyacentesEspecial(esquina);
		else{
			Object[] esquinasAdyacentes = new Object[5];
			for(int i=0;i<esquinas.length;i++){
				for(int j=0;j<esquinas[i].length;j++){
					
					
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i+2)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j))
						esquinasAdyacentes[0]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i+1)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j)&&(esquinas[i][j].getCoordenada())!=0)
						esquinasAdyacentes[0]=esquinas[i][j];
						
					
					
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i-1)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j))
						esquinasAdyacentes[1]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i-2)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j)&&(esquinasAdyacentes[1])!=null&&(((Esquina)esquinasAdyacentes[1])).getCoordenada()==0)
						esquinasAdyacentes[1]=esquinas[i][j];
					
						
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j-1))
						esquinasAdyacentes[2]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j-2)&&(esquinasAdyacentes[2])!=null&&(((Esquina)esquinasAdyacentes[2])).getCoordenada()==0)
						esquinasAdyacentes[2]=esquinas[i][j];
					
					
						
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j+2))
								esquinasAdyacentes[3]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j+1)&&(esquinas[i][j].getCoordenada())!=0)
						esquinasAdyacentes[3]=esquinas[i][j];
	
			
						
					}
								
				}
			
			for(int i=0;i<esquinasAdyacentes.length;i++){
				if (esquinasAdyacentes[i]==null)
					esquinasAdyacentes[i]= new Esquina(0,"No existe esquina",0,0);
			}
			return esquinasAdyacentes;
		}
				
			}
	
	
	public Object[] verVecinosAdyacentesEspecial(Esquina esquina){
			Object[] esquinasAdyacentes = new Object[5];
			for(int i=0;i<esquinas.length;i++){
				for(int j=0;j<esquinas[i].length;j++){
					
					
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i+2)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j))
						esquinasAdyacentes[0]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i+1)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j)&&(esquinas[i][j].getCoordenada())!=0)
						esquinasAdyacentes[0]=esquinas[i][j];
						
					
					
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i-1)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j))
						esquinasAdyacentes[1]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i-2)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j)&&(esquinasAdyacentes[1])!=null&&(((Esquina)esquinasAdyacentes[1])).getCoordenada()==0)
						esquinasAdyacentes[1]=esquinas[i][j];
					
						
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j-1))
						esquinasAdyacentes[2]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j-2)&&(esquinasAdyacentes[2])!=null&&(((Esquina)esquinasAdyacentes[2])).getCoordenada()==0)
						esquinasAdyacentes[2]=esquinas[i][j];
					
					
						
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j+2))
								esquinasAdyacentes[3]=esquinas[i][j];
					if((this.obtenerPosicion(esquina.getCoordenada())[0]==i)&&(this.obtenerPosicion(esquina.getCoordenada())[1]==j+1)&&(esquinas[i][j].getCoordenada())!=0)
						esquinasAdyacentes[3]=esquinas[i][j];
	
			
						
					}
								
				}
			
			//Esquinas diagonales
		switch(esquina.getCoordenada()){
		case 95:
			esquinasAdyacentes[4]= new Esquina(100,"Las Heras - R. de Castro",0,0);
			break;
		case 100:
			esquinasAdyacentes[4]=new Esquina(95,"Junin - Manuel Belgrano",0,0);
			break;
		case 110:
			esquinasAdyacentes[4]=new Esquina(98,"Suipacha - Manuel Belgrano",0,0);
			break;
		case 98:
			esquinasAdyacentes[4]=new Esquina(110,"R. de Castro - Junin",0,0);
			break;
		case 29:
			esquinasAdyacentes[4]=new Esquina(32,"Boulevar Pellegrini - 25 de Mayo",0,0);
			break;
		case 32:
		esquinasAdyacentes[4]=new Esquina(29,"San Jeronimo - San Martin",0,0);
		break;
		
		}
		
		
		for(int i=0;i<esquinasAdyacentes.length;i++){
			if (esquinasAdyacentes[i]==null)
				esquinasAdyacentes[i]= new Esquina(0,"No existe esquina",0,0);
		}
		
		return esquinasAdyacentes;
		
		}
	

	public boolean[] direccionesPosibles(Esquina esquina){
		Object[] vecinasAdy = this.verVecinosAdyacentes(esquina);
		boolean[] direccionesValidas= new boolean[5];
		
		for(int k=0; k<vecinasAdy.length;k++){
			if ( ((Esquina)vecinasAdy[k]).getCoordenada()!=0)
				direccionesValidas[k]=true;
			}
		return direccionesValidas;
			
		}
	
	public Esquina get1esquinaN(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(x>0)
			if(cuadrante[x-1][y].getCoordenada()!=0)
				return cuadrante[x-1][y];
		if(x>1)
			if(cuadrante[x-1][y].getCoordenada()==0 && cuadrante[x-2][y].getCoordenada()!=0)
				return cuadrante[x-2][y];
		return cuadrante[x-3][y];
	}
	
	public Esquina get1esquinaS(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x+1][y].getCoordenada()!=0)
			return cuadrante[x+1][y];
		if(cuadrante[x+1][y].getCoordenada()==0 && cuadrante[x+2][y].getCoordenada()!=0)
			return cuadrante[x+2][y];
		else
			return cuadrante[x+3][y];

	}
	
	public Esquina get1esquinaE(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x][y+1].getCoordenada()!=0)
			return cuadrante[x][y+1];
		if(cuadrante[x+1][y].getCoordenada()==0 && cuadrante[x][y+2].getCoordenada()!=0)
			return cuadrante[x][y+2];
		else
			return cuadrante[x+3][y];

	}
	
	public Esquina get1esquinaO(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x][y-1].getCoordenada()!=0)
			return cuadrante[x][y-1];
		if(cuadrante[x][y-1].getCoordenada()==0 && cuadrante[x][y-1].getCoordenada()!=0)
			return cuadrante[x][y-2];
		else
			return cuadrante[x][y-2];

	}
	
	public Esquina get2esquinaN(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(x>1)
			if(cuadrante[x-1][y].getCoordenada()!=0 && cuadrante[x-2][y].getCoordenada()!=0)
				return cuadrante[x-2][y];
		else if (cuadrante[x-1][y].getCoordenada()!=0 && cuadrante[x-3][y].getCoordenada()!=0)
			return cuadrante[x-3][y];
		return null;

	}
	
	public Esquina get2esquinaS(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x+1][y].getCoordenada()!=0 && cuadrante[x+2][y].getCoordenada()!=0)
			return cuadrante[x+2][y];
		else if (cuadrante[x+1][y].getCoordenada()!=0&&cuadrante[x+3][y].getCoordenada()!=0)
			return cuadrante[x+3][y];
		return null;

	}
	
	public Esquina get2esquinaE(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x][y+1].getCoordenada()!=0 && cuadrante[x][y+2].getCoordenada()!=0)
			return cuadrante[x][y+2];
		else if (cuadrante[x][y+1].getCoordenada()!=0&&cuadrante[x][y+3].getCoordenada()!=0)
			return cuadrante[x][y+3];
		return null;

	}
	
	public Esquina get2esquinaO(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x][y-1].getCoordenada()!=0 && cuadrante[x][y-2].getCoordenada()!=0)
			return cuadrante[x][y-2];
		else if (cuadrante[x][y-1].getCoordenada()!=0&&cuadrante[x][y-3].getCoordenada()!=0)
			return cuadrante[x][y-3];
		return null;

	}
	
	public Esquina get3esquinaN(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x-1][y].getCoordenada()!=0 && cuadrante[x-2][y].getCoordenada()!=0&& cuadrante[x-3][y].getCoordenada()!=0)
			return cuadrante[x-3][y];
		return null;

	}
	
	public Esquina get3esquinaS(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x+1][y].getCoordenada()!=0 && cuadrante[x+2][y].getCoordenada()!=0&& cuadrante[x+3][y].getCoordenada()!=0)
			return cuadrante[x+3][y];
		return null;

	}
	
	public Esquina get3esquinaE(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x][y+1].getCoordenada()!=0 && cuadrante[x][y+2].getCoordenada()!=0&& cuadrante[x][y+3].getCoordenada()!=0)
			return cuadrante[x][y+3];
		return null;

	}
	
	public Esquina get3esquinaO(int esquina){
		Esquina[][] cuadrante = esquinas;
		int[] posicion = this.obtenerPosicion(esquina);
		int x = posicion[0];
		int y = posicion[1];
		if(cuadrante[x][y-1].getCoordenada()!=0 && cuadrante[x][y-2].getCoordenada()!=0&& cuadrante[x][y-3].getCoordenada()!=0)
			return cuadrante[x][y-3];
		return null;

	}

	public int actualizarIntensidad() {
		int unaIntensidad = 20 * this.sumarPersonas();
		intensidad = unaIntensidad;
		return unaIntensidad;
	}

	public void setIntensidad(int i) {
		intensidad = i;
		
	}
	
	public int getCantidadEsquinas() {
		return cantidadEsquinas;
	}

	public void setCantidadEsquinas(int cantidadEsquinas) {
		this.cantidadEsquinas = cantidadEsquinas;
	}
	
}
				


